package org.example;

/**
 * this溢出问题
 * New的实际由以下命令组成， astore_1实际上就是已经创建好了，如果和invokespecial对调顺序实际就是没有初始化完。但这个在乱序执行里是可能发生的。
 * 所以如果乱序执行的话，会导致可能拿到的对象没有初始化变量。由于volatile只是控制了可见性和禁止重排，所以就不会拿到版初始化的对象了
 * 0 new
 * 3 dup
 * 4 invokespecial
 * 7 astore_1
 * 如果拿到半成品num默认是0不是8导致输出0
 * 0 new
 * 3 dup
 * 4 astore_1
 * 7 invokespecial
 * https://godbolt.org/ 可以看到
 */
public class ThisEscape {
    private int num = 8;

    // 不要在构造方法里启动线程，要不然由于乱序执行会打出0
    public ThisEscape(){
        new Thread(()-> System.out.println(this.num)).start();
    }

    public static void main(String[] args) throws  Exception{
        new ThisEscape();
        System.in.read();
    }

}
